/**********************************************************************************************************
** 驱动文件：	tingdian-PM08.c
** 驱动类型：	tingdian
** 设备名称：	空开监测
** 设备型号：	PM08
** 设备品牌：	融智云
** 设备协议：	Modbus-RTU
** 驱动描述：	用于空开断电检测，每个传感器可以检测八个空开状态。
** 生成日期：	2019-09-19 10:56:05
**********************************************************************************************************/
#include "Includes.h"


/**********************************************************************************************************
* 定义设备数据点变量结构
**********************************************************************************************************/
typedef struct{
	Var status;									//空开状态
}Data_Struct;									//定义变量结构


/**********************************************************************************************************
* 设备数据点变量属性声明
**********************************************************************************************************/
const static Var_Property_Def var_attr[] = {
	{
		BOOLEAN,
		0,
		READONLY,
		"status",
		"空开状态",
		"",
		"空开状态监测",
		1,
		0,
		"空开断电",
		"",
		0.000,
		0.000
	}
};


/**********************************************************************************************************
* 函数名称： static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
* 函数说明： 生成获取传感器数据指令
* 输入参数： 指令索引，传感器地址，变量结构体指针,以及指令缓存区指针,指令长度
* 返回参数： 无
**********************************************************************************************************/
static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
{
	unsigned short deviceAddr;
	deviceAddr = addr/10;
	switch(index)
	{
		case 0:
			cmd[0] = deviceAddr;
			cmd[1] = 0x02;
			cmd[2] = 0;			
			cmd[3] = 0;
			cmd[4] = 0;
			cmd[5] = 8;	
			*len = CRC16_Padding(cmd, 6);
			break;
		default:
			break;
	}
}


/**********************************************************************************************************
* 函数名称： static int parse_fun(short index, int addr, void *data, char *buf, short len)
* 函数说明： 解析传感器响应的数据，并写入数据库
* 输入参数： 解析索引,传感器地址，变量结构体指针，以及响应数据缓存取指针，响应数据长度
* 返回参数： 返回解析结果，返回0成功，返回1失败
**********************************************************************************************************/
static int parse_fun(short index, int addr, void *data, char *buf, short len)
{
	Data_Struct 	*d = (Data_Struct*)data;
	unsigned char	*buffer = (unsigned char*)buf;
	unsigned short	deviceAddr = addr/10;
	unsigned short	devicePort = addr%10-1;
	if(buf!=NULL && len==6 && buffer[0]==deviceAddr)
	{	
		if(CRC16_Check(buf,len))
		{
			if(((unsigned char)buf[3])&(0x0001<<devicePort)){
				d->status.value.inum = 1;
				Set_Var_Status(&d->status, Normal, NULL);
			}
			else{
				d->status.value.inum = 0;
				Set_Var_Status(&d->status, Alarm, NULL);
			}
			return 0;
		}
	}
	return 1;
}


/**********************************************************************************************************
* 函数名称： void tingdian_PM08_Registration(void)
* 函数说明： 空开监测驱动注册
* 输入参数： 无
* 返回参数： 无
**********************************************************************************************************/
void tingdian_PM08_Registration(void)
{
	DeviceDriverRegistration(
		"tingdian",												//设备类型
		"空开监测",												//设备名称（导航栏默认显示名称）
		"融智云",												//设备品牌
		"PM08",													//设备型号
		"用于空开断电检测，每个传感器可以检测八个空开状态。",	//驱动描述
		var_attr,												//变量属性声明
		sizeof(Data_Struct),									//变量结构体空间大小
		cmd_fun,												//发送指令生成函数
		parse_fun,												//数据解析函数
		250														//设备响应超时时间
	);
#if 0
	#define	CMD1	"\x01\x02\x00\x00\x00\x08\x79\xCC"
	#define	RSP1	"\x01\x02\x01\xAA\x21\xF7"
	VirtualFrameRegistration(CMD1, sizeof(CMD1)-1, RSP1, sizeof(RSP1)-1);
#endif	
}

